using System;
using System.IO;


namespace CKM_Komiwojazer
{
	/// <summary>
	/// Klasa przechowujaca informacje o kosztach przejazdu miedzy poszczegolnymi miastami.
	/// </summary>
	public class Koszty
	{
        /// <summary>
        /// Zwraca ilosc miast, dla ktorych okreslone sa koszty.
        /// </summary>
        public int IloscMiast
        {
            get
            {
                return iloscMiast;
            }
        }
        private int[][] koszty;
        private int iloscMiast;

		/// <summary>
		/// Tworzy obiekt kosztow na podstawie pliku.
		/// </summary>
		/// <param name="nazwaPliku">nazwa pliku z kosztami</param>
		public Koszty(String nazwaPliku)
		{
			if (!File.Exists(nazwaPliku))
				throw new FileNotFoundException("Nie znaleziono pliku", nazwaPliku);
			//nie trzeba sie martwic o zamykanie pliku
            try
            {
                using (StreamReader sr = new StreamReader(nazwaPliku))
                {
                    String line;
                    if ((line = sr.ReadLine()) == null)
                    {
                        throw new FileLoadException("Zly format pliku", nazwaPliku);
                    }
                    else
                    {
                        iloscMiast = int.Parse(line);
                    }

                    koszty = new int[iloscMiast - 1][];

                    for (int i = 0; i < iloscMiast - 1; i++)
                    {
                        if ((line = sr.ReadLine()) == null)
                        {
                            throw new FileLoadException("Zly format pliku", nazwaPliku);
                        }

                        string[] split = line.Split(new Char[] { ' ', ',' });
                        koszty[i] = new int[iloscMiast - i - 1];
                        int j = 0;
                        foreach (string s in split)
                        {
                            if (s != "")
                                koszty[i][j++] = int.Parse(s);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new FileLoadException("Zly format pliku", nazwaPliku);
            }
		}

		/// <summary>
		/// Tworzy <c>String</c> opisujacy koszty.
		/// </summary>
		/// <returns>opis kosztow</returns>
		public override String ToString()
		{
			String wynik = "" + iloscMiast;
			for (int i = 0; i < iloscMiast; i++)
			{
				wynik += "\n0" ;
				for(int j = 0; j < iloscMiast - i - 1; j++)
				{ 
					wynik += " " + koszty[i][j];
				}				
			}
			return wynik;
		}

		/// <summary>
		/// Dostep do kosztu przejazdu miedzy miastemA i miastemB.
		/// </summary>
		public int this[int miastoA, int miastoB]
		{			
			get
			{
				//miasta poza zakresem
				if (miastoA < 1 || miastoA > iloscMiast 
					|| miastoB < 1 || miastoB > iloscMiast)
					return -1;
				//to samo miasto
				if (miastoA == miastoB)
					return 0;
				if (miastoA > miastoB)
				{
					int t = miastoA;
					miastoA = miastoB;
					miastoB = t;				
				}
				//sztuczki z zakresem
				return koszty[miastoA - 1][miastoB - miastoA - 1];
			}
			set
			{
				if (miastoA > 0 && miastoA <= iloscMiast 
					&& miastoB > 0 && miastoB <= iloscMiast
					&& miastoA != miastoB
					&& value > 0 )
				{
					if (miastoA > miastoB)
					{
						int t = miastoA;
						miastoA = miastoB;
						miastoB = t;				
					}
					koszty[miastoA - 1][miastoB - miastoA - 1] = value;
				}
			}
		}


	}
}
